package com.brian.app_core_libstarter.application;

import android.os.Build;

import androidx.annotation.RequiresApi;

import com.brian.app_core_libstarter.application.grap.TaskSortUtil;
import com.brian.app_core_libstarter.application.impl.DependsTaskCollect;
import com.brian.app_core_libstarter.application.impl.DispatchRunnable;
import com.brian.app_core_libstarter.application.impl.DispatcherExecutor;
import com.brian.app_core_libstarter.application.task.ThreadTask;
import com.brian.app_core_libstarter.application.util.TaskUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;

/**
 * @ProjectName: PathFinder
 * @Package: com.brian.app_core_libstarter.application
 * @ClassName: TaskDispatcher
 * @Description: task 任务分发器，将任务进行分类和排序，执行
 * @Author: Brian
 * @CreateDate: 2019/11/23 21:07
 * @UpdateUser: Brian
 * @UpdateDate: 2019/11/23 21:07
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
public class TaskDispatcher {

    /*** 主线程任务数组 ***/
    private volatile List<ThreadTask> mAllThreadTasks = new ArrayList<>();
    private volatile List<Class<? extends ThreadTask>> mClsAllTasks = new ArrayList<>();

    /*** 已经结束了的Task ***/
    private volatile List<Class<? extends ThreadTask>> mFinishedTasks = new ArrayList<>(100);

    private DependsTaskCollect dependsTaskCollect;

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public TaskDispatcher() {
        this.dependsTaskCollect = new DependsTaskCollect();
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public TaskDispatcher addTask(ThreadTask threadTask){
        TaskUtil.checkNull(threadTask);
        // 通知 依赖管理类 有任务进来 是否需要处理 依赖关系
        this.dependsTaskCollect.collectDepends(threadTask);
        mAllThreadTasks.add(threadTask);
        mClsAllTasks.add(threadTask.getClass());
        return this;
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public TaskDispatcher start(){
        // TODO 在开始之前 一定要根据依赖关系 来将所有的task 进行一次 拓扑图的排序 生成有向无环的图表
        // TODO 因为一旦 后置任务阻塞线程 那么前置任务 就无法开始 就会出现线程卡死的问题
        mAllThreadTasks = TaskSortUtil.getSortResult(mAllThreadTasks, mClsAllTasks);

        for(ThreadTask threadTask: mAllThreadTasks){
            System.out.println("wo shi shen start " + threadTask.getClass().getSimpleName());
            DispatchRunnable.builder().task(threadTask).finishCallBack(new DispatchRunnable.FinishCallBack() {
                @Override
                public void onFinish(ThreadTask task) {
                    System.out.println("有一个任务结束了");
                    // 通知 依赖管理类 有任务完成 是否需要处理 依赖关系
                    TaskDispatcher.this.dependsTaskCollect.satisfyChildren(task);
                }
            }).run();
            System.out.println("wo shi shen start 循环结尾");
        }
        return this;
    }

    public TaskDispatcher cancle(){

        return this;
    }

    public TaskDispatcher await(){

        return this;
    }

    public final List<ThreadTask> getAllThreadTasks() {
        return mAllThreadTasks;
    }

    public void setAllThreadTasks(List<ThreadTask> mAllThreadTasks) {
        this.mAllThreadTasks = mAllThreadTasks;
    }

    public final List<Class<? extends ThreadTask>> getClsAllTasks() {
        return mClsAllTasks;
    }

    private ExecutorService runOnIO (){
        return DispatcherExecutor.getIOExecutor();
    }
}
